home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Multimedia / Movie3.0 / Source / xanim / xanim_dl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-02  |  8.8 KB  |  352 lines

  1.  
  2. /*
  3.  * xanim_dl.c
  4.  *
  5.  * Copyright (C) 1990,1991,1992,1993,1994 by Mark Podlipec. 
  6.  * All rights reserved.
  7.  *
  8.  * This software may be freely copied, modified and redistributed without
  9.  * fee for non-commerical purposes provided that this copyright notice is
  10.  * preserved intact on all copies and modified copies.
  11.  * 
  12.  * There is no warranty or other guarantee of fitness of this software.
  13.  * It is provided solely "as is". The author(s) disclaim(s) all
  14.  * responsibility and liability with respect to this software's usage
  15.  * or its effect upon hardware or computer systems.
  16.  *
  17.  */
  18.  
  19. #include "xanim_dl.h"
  20.  
  21. XA_CHDR   *ACT_Get_CMAP();
  22. XA_ACTION *ACT_Get_Action();
  23. void  ACT_Setup_Mapped();
  24. void  ACT_Add_CHDR_To_Action();
  25. void  ACT_Setup_Loop();
  26. LONG  UTIL_Get_LSB_Short();
  27. ULONG UTIL_Get_LSB_Long();
  28. void  UTIL_Sub_Image();
  29. ULONG DL_Read_File();
  30.  
  31. static ULONG dl_version;
  32. static ULONG dl_format;
  33. static ULONG dl_time;
  34. static UBYTE dl_title[21];
  35. static UBYTE dl_author[21];
  36. static ULONG dl_num_of_screens;
  37. static ULONG dl_num_of_images;
  38. static ULONG dl_ims_per_screen;
  39. static ULONG dl_num_of_frames;
  40. static ULONG dl_frame_cnt;
  41. static ULONG dl_loop_frame;
  42. static XA_ACTION **dl_frame_lst;
  43. static ULONG dl_imagex,dl_imagey,dl_imagec;
  44.  
  45. static ColorReg dl_cmap[DL_MAX_COLORS];
  46.  
  47. static XA_ACTION **dl_acts;
  48. static XA_CHDR *dl_chdr;
  49. static ULONG dl_image_cnt;
  50.  
  51. /*
  52.  *
  53.  */
  54. LONG Is_DL_File(filename)
  55. char *filename;
  56. {
  57.   FILE *fin;
  58.   ULONG data0,data1;
  59.  
  60.   if ( (fin=fopen(filename,XA_OPEN_MODE)) == 0) return(XA_NOFILE);
  61.   data0 = fgetc(fin);
  62.   data1 = fgetc(fin);
  63.   fclose(fin);
  64.   if (data0 == 0x01) return(TRUE);
  65.   if (data0 == 0x02)
  66.   {
  67.     if ( (data1 >= 0x00) && (data1 <= 0x02) ) return(TRUE);
  68.   }
  69.   return(FALSE);
  70. }
  71.  
  72. /*
  73.  *
  74.  */
  75. ULONG DL_Read_File(fname,anim_hdr)
  76. XA_ANIM_HDR *anim_hdr;
  77. char *fname;
  78. {
  79.   FILE *fin;
  80.   LONG i,j,ret,tmp;
  81.   XA_ACTION *act;
  82.   UBYTE *pic;
  83.   ULONG pic_size;
  84.   XA_ACTION *prev_end_act;
  85.  
  86.   dl_chdr = 0;
  87.   dl_acts = 0; 
  88.   dl_ims_per_screen = 1;
  89.  
  90.   if ( (fin = fopen(fname,XA_OPEN_MODE)) == 0)
  91.   { 
  92.     fprintf(stderr,"DL_Read_File: Can't open %s for reading.\n",fname); 
  93.     return(FALSE);
  94.   }
  95.  
  96.   dl_version = fgetc(fin);  /* either 1 or 2 */
  97.  
  98.   switch(dl_version)
  99.   {
  100.     case DL_VERSION_1:
  101.         dl_format = DL_FORM_MEDIUM;
  102.         break;
  103.     case DL_VERSION_2:
  104.         dl_format = fgetc(fin);
  105.         break;
  106.     default:
  107.         break;
  108.   }
  109.  
  110.   switch(dl_format)
  111.   {
  112.     case DL_FORM_LARGE:
  113.     dl_imagex = DL_LARGE_XSIZE;
  114.     dl_imagey = DL_LARGE_YSIZE;
  115.     dl_ims_per_screen = 1;
  116.     break;
  117.     case DL_FORM_MEDIUM:
  118.     dl_imagex = DL_MEDIUM_XSIZE;
  119.     dl_imagey = DL_MEDIUM_YSIZE;
  120.     dl_ims_per_screen = 4;
  121.     break;
  122.     case DL_FORM_SMALL:
  123.     dl_imagex = DL_SMALL_XSIZE;
  124.     dl_imagey = DL_SMALL_YSIZE;
  125.     dl_ims_per_screen = 16;
  126.     break;
  127.     default:
  128.     fprintf(stderr,"DL_Read_File: unknown format %lx\n",dl_format);
  129.     return(FALSE);
  130.     break;
  131.   }
  132.  
  133.   dl_title[20] = 0;
  134.   for(i=0; i<20; i++) 
  135.   {
  136.     tmp = fgetc(fin);
  137.     dl_title[i] = (tmp)?(tmp ^ 0xff):tmp;
  138.   }
  139.  
  140.   dl_author[0] = dl_author[20] = 0;
  141.   if (dl_version == DL_VERSION_2)
  142.   {
  143.     for(i=0; i<20; i++)
  144.     {
  145.       tmp = fgetc(fin);
  146.       dl_author[i] = (tmp)?(tmp ^ 0xff):tmp;
  147.     }
  148.   }
  149.  
  150.   dl_num_of_screens = fgetc(fin);
  151. /*
  152.   dl_num_of_images = dl_num_of_screens * (dl_format * 3 + 1);
  153. */
  154.   dl_num_of_images = dl_num_of_screens * dl_ims_per_screen;
  155.  
  156.   if (dl_version == DL_VERSION_1)
  157.      dl_num_of_frames = UTIL_Get_LSB_Short(fin);
  158.   else
  159.      dl_num_of_frames = UTIL_Get_LSB_Long(fin);
  160.  
  161.   if (xa_verbose == TRUE)
  162.   {
  163.     fprintf(stderr,"   Version %ld  Format %ld",dl_version,dl_format);
  164.     fprintf(stderr," Images %ld  Frames %ld\n",
  165.             dl_num_of_images, dl_num_of_frames );
  166.     fprintf(stderr,"   Title = %s  Author = %s\n",dl_title,dl_author);
  167.   }
  168.  
  169.   dl_imagec = DL_MAX_COLORS;
  170.   for(i=0; i < DL_MAX_COLORS; i++)
  171.   {
  172.     dl_cmap[i].red   = fgetc(fin) & 0x3f;
  173.     dl_cmap[i].green = fgetc(fin) & 0x3f;
  174.     dl_cmap[i].blue  = fgetc(fin) & 0x3f;
  175.   }
  176.   dl_chdr = ACT_Get_CMAP(dl_cmap,DL_MAX_COLORS,0,DL_MAX_COLORS,0,6,6,6);
  177.   
  178.   pic_size = dl_imagex * dl_imagey;
  179.   dl_time = XA_GET_TIME(100);
  180.  
  181.   dl_acts = (XA_ACTION **)malloc(dl_num_of_images * sizeof(XA_ACTION *));
  182.   dl_image_cnt = 0;
  183.  
  184.   for(j = 0; j < dl_num_of_screens; j++)
  185.   {
  186.     switch(dl_format)
  187.     {
  188.       case DL_FORM_LARGE: /* large */
  189.     pic = (UBYTE *) malloc( XA_PIC_SIZE(pic_size) );
  190.     if (pic == 0) TheEnd1("DL: malloc failed.\n");
  191.         ret = fread(pic, pic_size, 1, fin);
  192.     if (ret != 1) TheEnd1("DL: read of image failed format 0");
  193.     DEBUG_LEVEL2 fprintf(stderr,"Read large format image\n");
  194.         act = ACT_Get_Action(anim_hdr);
  195.     dl_acts[dl_image_cnt] = act;  dl_image_cnt++;
  196.     ACT_Setup_Mapped(act,pic,dl_chdr,0,0,dl_imagex,dl_imagey,
  197.         dl_imagex,dl_imagey,FALSE,0,TRUE,TRUE,FALSE);
  198.     ACT_Add_CHDR_To_Action(act,dl_chdr);
  199.     break;
  200.  
  201.       case DL_FORM_MEDIUM: /* medium */
  202.       case DL_FORM_SMALL: /* medium */
  203.     {
  204.       ULONG x,y;
  205.       UBYTE *t_pic;
  206.  
  207.       tmp = DL_LARGE_XSIZE * DL_LARGE_YSIZE;
  208.       pic = (UBYTE *) malloc( tmp );
  209.       if (pic == 0) TheEnd1("DL: malloc failed.\n");
  210.           ret = fread(pic, tmp , 1, fin);
  211.       if (ret != 1) TheEnd1("DL: read of image failed format 1");
  212.       DEBUG_LEVEL2 fprintf(stderr,"Read small/medium image\n");
  213.  
  214.           for(y = 0; y < DL_LARGE_YSIZE; y += dl_imagey)
  215.             for(x = 0; x < DL_LARGE_XSIZE; x += dl_imagex)
  216.         {
  217.           t_pic = (UBYTE *) malloc( XA_PIC_SIZE(pic_size) );
  218.           if (t_pic == 0) TheEnd1("DL: malloc failed.\n");
  219.           UTIL_Sub_Image(t_pic,pic,dl_imagex,dl_imagey, x, y,(DL_LARGE_XSIZE),1);
  220.           act = ACT_Get_Action(anim_hdr);
  221.           dl_acts[dl_image_cnt] = act;  dl_image_cnt++;
  222.           ACT_Setup_Mapped(act,t_pic,dl_chdr, 0,0,dl_imagex,dl_imagey,
  223.             dl_imagex,dl_imagey,FALSE,0,TRUE,TRUE,FALSE);
  224.           ACT_Add_CHDR_To_Action(act,dl_chdr);
  225.         }
  226.     }
  227.     break;
  228.    }
  229.  }
  230.  
  231.  dl_frame_lst = (XA_ACTION **)malloc( dl_num_of_frames * sizeof(XA_ACTION *) );
  232.  if (dl_frame_lst == 0) TheEnd1("DL_Read_File: malloc failed");
  233.  
  234.  prev_end_act = 0;
  235.  dl_loop_frame = 0;
  236.  switch(dl_version)
  237.  {
  238.    case DL_VERSION_1:
  239.     dl_frame_cnt = 0;
  240.     for(i=0; i < dl_num_of_frames; i++)
  241.     {
  242.       register ULONG tmp;
  243.       tmp = fgetc(fin);
  244.       tmp = (tmp % 10) - 1 + ((tmp / 10) - 1) * 4;
  245.       dl_frame_lst[dl_frame_cnt] = dl_acts[tmp]; 
  246.       dl_frame_cnt++;
  247.     }
  248.     break;
  249.    case DL_VERSION_2:
  250.     {
  251.       DEBUG_LEVEL2 fprintf(stderr," DL reading frame lst: ");
  252.       dl_frame_cnt = 0;
  253.       i = 0;
  254.       while(i < dl_num_of_frames)
  255.       {
  256.         register ULONG tmp;
  257.         tmp  =  fgetc(fin); tmp |=  ( fgetc(fin) << 8); i++;
  258.         DEBUG_LEVEL2 fprintf(stderr,"\t<%ld %lx>",i,tmp);
  259.  
  260.         if (tmp & 0x8000)
  261.         {
  262.           switch(tmp)
  263.           {
  264.         case 0xffff:
  265.           {
  266.             ULONG cnt;
  267.             XA_ACTION *begin_act,*end_act;
  268.             ACT_END_LP_HDR *end_lp;
  269.  
  270.             cnt  =  fgetc(fin); cnt |=  ( fgetc(fin) << 8); i++;
  271.             DEBUG_LEVEL2 fprintf(stderr,"begin loop %ld",cnt);
  272.             begin_act = ACT_Get_Action(anim_hdr,0);
  273.             end_act = ACT_Get_Action(anim_hdr,0);
  274.                 dl_frame_lst[dl_frame_cnt] = begin_act;
  275.                 dl_frame_cnt++;
  276.             ACT_Setup_Loop(begin_act,end_act,cnt,dl_frame_cnt,
  277.                 0);
  278.             end_lp = (ACT_END_LP_HDR *)end_act->data;
  279.             end_lp->prev_end_act = prev_end_act;
  280.             prev_end_act = end_act;  /* nest loops */
  281.           }
  282.           break;
  283.         case 0xfffe:
  284.           {
  285.             ACT_END_LP_HDR *end_lp;
  286.             end_lp = (ACT_END_LP_HDR *)prev_end_act->data;
  287.             if (dl_frame_cnt > 0)
  288.             *end_lp->end_frame = dl_frame_cnt - 1;
  289.             else *end_lp->end_frame = 0;
  290.  
  291.                 dl_frame_lst[dl_frame_cnt] = prev_end_act;
  292.                 dl_frame_cnt++;
  293.             /* unnest loops */
  294.             prev_end_act = end_lp->prev_end_act;
  295.             DEBUG_LEVEL2 fprintf(stderr,"end loop ");
  296.           }
  297.           break;
  298.         case 0xfffd:
  299.             tmp  =  fgetc(fin); tmp |=  ( fgetc(fin) << 8); i++;
  300.             DEBUG_LEVEL2 fprintf(stderr,"key press %lx\n",tmp);
  301.             break;
  302.         default:
  303.             fprintf(stderr,"unknown code %lx\n",tmp);
  304.             break;
  305.         }
  306.         }
  307.         else
  308.         {
  309.           if (tmp < dl_image_cnt)
  310.           {
  311.             dl_frame_lst[dl_frame_cnt] = dl_acts[tmp];
  312.             dl_frame_cnt++;
  313.           }
  314.           else
  315.           {
  316.         fprintf(stderr,"   unknown code - ignored. %lx\n",tmp);
  317.           }
  318.         }
  319.       }
  320.       DEBUG_LEVEL2 fprintf(stderr,"\n");
  321.       if (dl_loop_frame >= dl_frame_cnt) dl_loop_frame = 0;
  322.     }
  323.     break;
  324.   }
  325.   anim_hdr->frame_lst = 
  326.     (XA_FRAME *)malloc(sizeof(XA_FRAME) * (dl_frame_cnt + 1) ); 
  327.   if (anim_hdr->frame_lst == NULL)
  328.       TheEnd1("DL_ANIM: couldn't malloc for frame_lst\0");
  329.  
  330.   for(i=0; i < dl_frame_cnt; i++) 
  331.   {
  332.     anim_hdr->frame_lst[i].act  = dl_frame_lst[i];
  333.     if (   (dl_frame_lst[i]->type == ACT_BEG_LP)
  334.         || (dl_frame_lst[i]->type == ACT_END_LP) )
  335.             anim_hdr->frame_lst[i].time = 0;
  336.     else anim_hdr->frame_lst[i].time = dl_time;
  337.   }
  338.   anim_hdr->frame_lst[dl_frame_cnt].time = 0;
  339.   anim_hdr->frame_lst[dl_frame_cnt].act  = 0;
  340.   anim_hdr->loop_frame = dl_loop_frame;
  341.   anim_hdr->last_frame = dl_frame_cnt-1;
  342.   anim_hdr->imagex = dl_imagex;
  343.   anim_hdr->imagey = dl_imagey;
  344.   anim_hdr->imagec = dl_imagec;
  345.   anim_hdr->imaged = 8; /* nop */
  346.  
  347.   FREE(dl_frame_lst,0x5000); dl_frame_lst=0;
  348.   FREE(dl_acts,0x5001); dl_acts=0;
  349.   return(TRUE);
  350. }
  351.  
  352.